package com.boil.qz.safekavass.weixin.service;

import com.alibaba.fastjson.JSONObject;
import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.model.WeixinUser;
import com.boil.qz.safekavass.pojo.ReportResVo;
import com.boil.qz.safekavass.repository.WeixinUserRepository;
import com.boil.qz.safekavass.service.ReportResService;
import com.boil.qz.safekavass.weixin.util.WeixinUtils;
import com.boil.util.Constants;
import com.boil.util.Page1;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by ChenYong on 2017-07-10.
 * <br>
 * 网页授权业务处理 Service。
 */
@Service
public class WebpageAuthorizeService {
    /**
     * 注入举报 Service
     */
    @Autowired
    private ReportResService reportResService;
    /**
     * 注入微信用户实体仓库
     */
    @Autowired
    private WeixinUserRepository weixinUserRepository;

    /**
     * snsapi_base 网页授权业务处理。
     *
     * @param resultVo 结果映射实例
     * @param openid   普通用户
     * @param state    重定向后会带上 state 参数，开发者可以填写 a-zA-Z0-9 的参数值，最多128字节
     * @return 重定向 URL
     */
    public String doAuthorizeSnsapiBase(ResultVo resultVo, String openid, String state) {
        // 重定向 URL
        String redirectUrl = null;

        // 跳转至我的举报页面
        if (Constants.PAGE_MY_REPORT.equals(state)) {
            // 排序方式
            List<String> orderBys = new ArrayList<String>();
            orderBys.add("REPORT_CREATE_TIME DESC");

            // 分页实例
            Page1<ReportResVo> page1 = new Page1<ReportResVo>(Constants.PAGE_SIZE_20, Constants.VALUE_1);
            page1.getParams().put(WeixinUtils.OPENID_STR, openid);
            page1.getParamss().put(Constants.ORDER_BY_STR, orderBys);

            // 分页查询
            reportResService.findInPageByOpenid(page1);

            resultVo.getResults().add(openid);
            resultVo.getResults().add(page1);

            redirectUrl = "/weixin/report/list";
        }

        return redirectUrl;
    }

    /**
     * snsapi_userinfo 网页授权业务处理。
     *
     * @param resultVo             结果映射实例
     * @param weixinUserJSONObject 微信用户 JSONObject
     * @param state                重定向后会带上 state 参数，开发者可以填写 a-zA-Z0-9 的参数值，最多128字节
     * @return 重定向 URL
     */
    public String doAuthorizeSnsapiUserinfo(ResultVo resultVo, JSONObject weixinUserJSONObject, String state) {
        // 获取 openid
        String openid = weixinUserJSONObject.getString(WeixinUtils.OPENID_STR);
        // 获取昵称
        String nickname = weixinUserJSONObject.getString(WeixinUtils.NICKNAME_STR);
        // 根据 openid 获取微信用户
        WeixinUser weixinUser = weixinUserRepository.findByOpenid(openid);
        // 重定向 URL
        String redirectUrl = null;

        // 根据 openid 未获取微信用户
        if (weixinUser == null) {
            weixinUser = new WeixinUser();
            weixinUser.setOpenid(openid);
        }

        weixinUser.setNickname(weixinUserJSONObject.getString(WeixinUtils.NICKNAME_STR));
        weixinUser.setSex(weixinUserJSONObject.getIntValue(WeixinUtils.SEX_STR));
        weixinUser.setCity(weixinUserJSONObject.getString(WeixinUtils.CITY_STR));
        weixinUser.setProvince(weixinUserJSONObject.getString(WeixinUtils.PROVINCE_STR));
        weixinUser.setCountry(weixinUserJSONObject.getString(WeixinUtils.COUNTRY_STR));
        weixinUser.setHeadimgurl(weixinUserJSONObject.getString(WeixinUtils.HEADIMGURL_STR));
        weixinUser.setUnionid(weixinUserJSONObject.getString(WeixinUtils.UNIONID_STR));

        // 未关注
        if (weixinUser.getId() == null) {
            weixinUserRepository.save(weixinUser);
        }

        // 跳转至绑定手机号页面
        if (Constants.PAGE_BIND_PHONE.equals(state) || StringUtils.isBlank(weixinUser.getPhone())) {
            resultVo.getResults().add(openid);
            resultVo.getResults().add(state);
            resultVo.getResults().add(weixinUser.getPhone());

            redirectUrl = "/weixin/bind-phone";

            // 用户已绑定手机号
        } else {
            // 跳转至举报页面
            if (Constants.PAGE_REPORT.equals(state)) {
                resultVo.getResults().add(openid);
                resultVo.getResults().add(nickname);

                redirectUrl = "/weixin/report/add";
            }
        }

        return redirectUrl;
    }
}